package br.com.spb.web;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import br.com.spb.domain.Deputado;
import br.com.spb.domain.Estado;
import br.com.spb.domain.Governador;
import br.com.spb.domain.Municipio;
import br.com.spb.domain.Partido;
import br.com.spb.domain.Prefeito;
import br.com.spb.domain.Regiao;
import br.com.spb.domain.Vereador;
import br.com.spb.persistence.DeputadoDao;
import br.com.spb.persistence.EstadoDao;
import br.com.spb.persistence.GovernadorDao;
import br.com.spb.persistence.MunicipioDao;
import br.com.spb.persistence.PartidoDao;
import br.com.spb.persistence.PrefeitoDao;
import br.com.spb.persistence.RegiaoDao;
import br.com.spb.persistence.VereadorDao;
import br.com.spb.support.SpbUtils;
 

public class Teste {

	public static String getDados(){   
		listMunicipio = new MunicipioDao().findAll();
		listPartido = new PartidoDao().findAll();
		listEstado = new EstadoDao().findAll();
		savePrefeitos();
		saveGovernadores(); 
		return "";
	}
 
	 
	static List<Municipio> listMunicipio;
	static List<Partido> listPartido;
	static List<Estado> listEstado;

	public static Municipio getMunicipio(String nome){   
		Municipio municipio = null;
		for(Municipio m: listMunicipio){
			if(SpbUtils.removeCaraceres(m.getNome().toLowerCase()).equals(SpbUtils.removeCaraceres(nome.toLowerCase()))){ 
				municipio = m;
				break;
			}
		}
		return municipio;
	}
	public static Partido getPartido(String nome){   
		Partido partido = null;
		for(Partido m: listPartido){
			if(SpbUtils.removeCaraceres(m.getSigla().toLowerCase()).equals(SpbUtils.removeCaraceres(nome.toLowerCase()))){ 
				partido = m;
				break;
			}
		}
		return partido;
	}

	public static void savePrefeitos(){    
		try {
			HSSFWorkbook xls = readFile(PASTA_ARQUIVOS_XLS+File.separatorChar+"eleicoes_2008.xls");
			    
			for(Entry<String, String[]> mapa : getDados(xls.getSheetAt(0)).entrySet()){   
				savePrefeito(mapa.getValue());
			} 

			for(Entry<String, String[]> mapa : getDados(xls.getSheetAt(1)).entrySet()){   
				saveVereador(mapa.getValue());
			}  
			xls = null;  
		} catch (Exception e) {  
			e.printStackTrace();
		}  
	}

	public static void saveGovernadores(){    
		try {
			HSSFWorkbook xls = readFile(PASTA_ARQUIVOS_XLS+File.separatorChar+"eleicoes_2010.xls");
			    
			for(Entry<String, String[]> mapa : getDados(xls.getSheetAt(0)).entrySet()){   
				saveDeputado(mapa.getValue());
			} 

			for(Entry<String, String[]> mapa : getDados(xls.getSheetAt(2)).entrySet()){   
				saveGovernador(mapa.getValue());
			}  
			xls = null;  
		} catch (Exception e) {  
			e.printStackTrace();
		}  
	}
	
	
	/**
	 * @param dados
	 */
	private static void savePrefeito(String[] dados){
		try {
			Partido partido = getPartido(dados[4]);
			Municipio municipio = getMunicipio(dados[1]);

			if(partido != null && municipio != null){

				Prefeito prefeito = new Prefeito();
				prefeito.setCodMunicipioOrigem(municipio.getCodigo());
				prefeito.setCodMunicipio(partido.getCodigo());
				prefeito.setCodPartido(partido.getCodigo());
				prefeito.setNome(dados[3]);
				prefeito.setNumVotos(new Long(dados[5]));
				new PrefeitoDao().save(prefeito);	
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	} 
	
	
	private static void saveDeputado(String[] dados){
		try {
			Partido partido = getPartido(dados[4]);
			Municipio municipio = getMunicipio(dados[1]);

			if(partido != null && municipio != null){

				Deputado deputado = new Deputado();
				deputado.setCodMunicipioOrigem(municipio.getCodigo());
				deputado.setCodPartido(partido.getCodigo());
				deputado.setSigUf(dados[0]);
				deputado.setNome(dados[3]);
				deputado.setNumVotos(new Long(dados[5]));
				new DeputadoDao().save(deputado);	
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	} 
	private static void saveVereador(String[] dados){
		try {
			Partido partido = getPartido(dados[4]);
			Municipio municipio = getMunicipio(dados[1]);

			if(partido != null && municipio != null){

				Vereador vereador = new Vereador();
				vereador.setCodMunicipioOrigem(municipio.getCodigo());
				vereador.setCodMunicipio(partido.getCodigo());
				vereador.setCodPartido(partido.getCodigo());
				vereador.setNome(dados[3]);
				vereador.setNumVotos(new Long(dados[5]));
				new VereadorDao().save(vereador);	
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	} 

	

	private static void saveGovernador(String[] dados){
		try {
			Partido partido = getPartido(dados[4]);
			Municipio municipio = getMunicipio(dados[1]);

			if(partido != null && municipio != null){

				Governador governador = new Governador();
				governador.setCodMunicipioOrigem(municipio.getCodigo());
				governador.setCodPartido(partido.getCodigo());
				governador.setSigUf(dados[0]);
				governador.setNome(dados[3]);
				governador.setNumVotos(new Long(dados[5]));
				new GovernadorDao().save(governador);	
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	} 
	
	
	public static Map<String, String[]> getDados(HSSFSheet planilha){     
		Map<String, String[]> map = new TreeMap<String,String[]>(); 
		String[][] dados = new String[planilha.getPhysicalNumberOfRows()][6];
		 
		for (int i = 1; i < planilha.getPhysicalNumberOfRows(); i++) {
			HSSFRow linha = planilha.getRow(i);
			if (linha == null) {
				continue;
			}

			dados[i-1] = getDados(linha); 
			map.put(dados[i-1][3], dados[i-1]);   	
			 
		} 
		
		return map;
	}
	 
	

	
	private static String[] getDados(HSSFRow linha){
		String[] dados = new String[6];
		try {  
			for(int i = 0; i < 6; i++){
				dados[i] = getCampo(linha.getCell(i));  				
			}
		} catch (Exception e) {  
			System.out.println(e.getMessage()); 
		} 
		return dados;
	}
	
	    
	
	public static void lerArquivos(){ 
		for(String[] nomeArquivo : arquivos){
			lerArquivo(nomeArquivo);
		}
	}
	
	private static void lerArquivo(String[] caminho) {
		try {
			HSSFWorkbook xls = readFile(PASTA_ARQUIVOS_XLS+File.separatorChar+caminho[1]);
			 
			HSSFSheet planilha = xls.getSheetAt(0);  

			for (int i = 1; i < planilha.getPhysicalNumberOfRows(); i++) {
				HSSFRow linha = planilha.getRow(i);
				if (linha == null) {
					continue;
				}
				montaLista(caminho[0], linha); 
			} 
			
		} catch (Exception e) { 
			e.printStackTrace();
		} 
	}

	/**
	 * @param linha
	 * @return
	 */
	private static void montaLista(String sigla, HSSFRow linha){
		try { 
			if(isNumber(getCampo(linha.getCell(0)))){
				Municipio municipio = new Municipio();   
				municipio.setNome(getCampo(linha.getCell(1))); 
				municipio.setNumHabitantes(new Long(getCampo(linha.getCell(7))));  
				municipio.setSigUf(sigla);
				 
				new MunicipioDao().save(municipio);	 
			}
		} catch (Exception e) {  
			e.printStackTrace(); 
		} 
	}

	private static boolean isNumber(String txt){
		boolean set = false; 
		try {
			Long num = new Long(txt);
			set = num > 0L;
		} catch (Exception e) {}
		return set;
	}

	public static final String PASTA_ARQUIVOS_XLS   = "/java/Teste/xls";  
	public static String[][] arquivos = {{"AC", "total_populacao_acre.xls"},
									   {"AL","total_populacao_alagoas.xls"},
									   {"AP","total_populacao_amapa.xls"},
									   {"AM","total_populacao_amazonas.xls"},
									   {"BA","total_populacao_bahia.xls"},
									   {"CE","total_populacao_ceara.xls"},
									   {"DF","total_populacao_distrito_federal.xls"},
									   {"ES","total_populacao_espirito_santo.xls"},
									   {"GO","total_populacao_goias.xls"},
									   {"MA","total_populacao_maranhao.xls"},
									   {"MS","total_populacao_mato_grosso_do_sul.xls"},
									   {"MT","total_populacao_mato_grosso.xls"},
									   {"MG","total_populacao_minas_gerais.xls"},
									   {"PA","total_populacao_para.xls"},
									   {"PB","total_populacao_paraiba.xls"},
									   {"PR","total_populacao_parana.xls"},
									   {"PE","total_populacao_pernambuco.xls"},
									   {"PI","total_populacao_piaui.xls"},
									   {"RJ","total_populacao_rio_de_janeiro.xls"},
									   {"RN","total_populacao_rio_grande_do_norte.xls"},
									   {"RS","total_populacao_rio_grande_do_sul.xls"},
									   {"RO","total_populacao_rondonia.xls"},
									   {"RR","total_populacao_roraima.xls"},
									   {"SC","total_populacao_santa_catarina.xls"},
									   {"SP","total_populacao_sao_paulo.xls"},
									   {"SE","total_populacao_sergipe.xls"},
									   {"TO","total_populacao_tocantins.xls"}};
	/**
	 * @param coluna
	 * @return
	 */
	private static String getCampo(HSSFCell coluna){
		String retorno = "";  
		switch (coluna.getCellType()) { 
			case HSSFCell.CELL_TYPE_FORMULA:
				retorno = "" + coluna.getCellFormula();
				break;

			case HSSFCell.CELL_TYPE_NUMERIC:
				Double x = coluna.getNumericCellValue(); 
				retorno = "" + x.intValue();
				break;

			case HSSFCell.CELL_TYPE_STRING:
				retorno = "" + coluna.getStringCellValue();
				break;

			default:
		}
		return retorno;
	}
	
	/**
	 * @param caminho
	 * @return
	 * @throws IOException
	 */
	private static HSSFWorkbook readFile(String caminho) throws IOException { 
		return new HSSFWorkbook(new FileInputStream(caminho));
	}
	


	public static String getEstados() {
		String txt = "<table style=\"width: 100%; height: 100%; border: 1px red solid;\"> \n";
		try { 
			List<Regiao> lista  = getListRegiao();

			txt += "<tr style=\"background-color: yellow;\"> \n";
			for(Regiao regiao :lista){
				txt += "<td style=\"background-color: #FF6A6A; text-align: center; border: 2px yellow solid;\">" + regiao.getNome() + "</td> \n"; 
			}
			txt += "</tr> \n"; 

			txt += "<tr style=\"background-color: #00BFFF;\"> \n";
			for(Regiao regiao :lista){ 
				txt += "<td style=\"text-align: center; border: 2px yellow solid;\"> \n <table style=\"width: 100%; height: 100%;\" > \n <tr>"; 
				for(Estado estado : regiao.getListEstado()){
					txt += "<td style=\"background-color: #BFEFFF; text-align: center\">" + estado.getSigUf()+"</td> \n"; 
					 
				}
				txt += "</tr> \n";  
				for(Estado estado : regiao.getListEstado()){  
					txt += "<td style=\"width: 100%; height: 100%;\">  \n <table  style=\"width: 100%; height: 100%;\"> \n"; 
					for(Municipio municipio : estado.getListMunicipio()){ 
						txt += "<tr style=\"background-color: #C1FFC1;\"><td>" + municipio.getNome()+"</td></tr> \n "; 
						
					}
					txt += "</table> \n </td> \n"; 
				}
				txt += "</tr> \n </table> \n </td>"; 
			}
			txt += "</tr> \n "; 
			 
			
		} catch (Exception e) {
			txt += "<tr><td>"+ e.getMessage()+"</td></tr>";
		}
		txt += "<table>";
		return txt;
	}
	
	public static String getRegioes() {
		String txt = "<table border=\"1\">";
		txt += "<tr><td>Nome</td><td>Habitantes</td></tr>";
		try { 
			for(Regiao regiao : getListRegiao()){
				txt += "<tr style=\"background-color: yellow;\">"; 
				txt += "<td>" + regiao.getNome()+"</td>";
				txt += "<td>" + regiao.getNumHabitantes()+"</td>";
				txt += "</tr>"; 
				for(Estado estado : regiao.getListEstado()){
					txt += "<tr style=\"background-color: red;\">";  
					txt += "<td>" + estado.getNome()+"</td>";
					txt += "<td>" + estado.getNumHabitantes()+"</td>";
					txt += "</tr>"; 
					for(Municipio municipio : estado.getListMunicipio()){ 
						txt += "<tr style=\"background-color: green;\">";  
						txt += "<td>" + municipio.getNome()+"</td>";
						txt += "<td>" + municipio.getNumHabitantes()+"</td>";
						txt += "</tr>";  
					} 
					txt += "<tr><td></td><td></td></tr>";
				}  
				txt += "<tr><td></td><td></td></tr>";
				txt += "<tr><td></td><td></td></tr>";
			}
			
		} catch (Exception e) {
			txt += "<tr><td>"+ e.getMessage()+"</td></tr>";
		}
		txt += "<table>";
		return txt;
	}

	public static String getMunicipios() {
		String txt = "<table border=\"1\">";
		txt += "<tr style=\"background-color: red;\"><td>UF</td><td>NOME</td><td>habitantes</td></tr>";
		try { 
			for(Municipio municipio : new MunicipioDao().findAll()){
				txt += "<tr><td>" + municipio.getSigUf()+"</td>";
				txt += "<td>" + municipio.getNome()+"</td>"; 
				txt += "<td>" + municipio.getNumHabitantes()+"</td></tr>"; 
				
			}
			
		} catch (Exception e) {
			txt += "<tr><td>"+ e.getMessage()+"</td></tr>";
		}
		txt += "<table>";
		return txt;
	}

	public static List<Regiao> getListRegiao(){
		List<Regiao> lista = new RegiaoDao().findAll();
		somar(lista);
		return lista;
	}

	private static void somar( List<Regiao> lista){ 
		for (Regiao r: lista) {     
			for (Estado e: r.getListEstado()) {   
				for (Municipio m: e.getListMunicipio()) {    
					e.addNumHabitantes(m.getNumHabitantes());
				}  
				r.addNumHabitantes(e.getNumHabitantes());
			}  
		}  
	}
}
